/*
Auteur        :Valentijn Polder
Studentnummer :0782531

$Log: UART.c,v $
Revision 1.5  2010/05/20 07:35:08  0782531
Commentaar toegevoegd.
IO uitwisselingen toegepast.
Juiste nitialistatie volgorde geimplementeerd

Revision 1.4  2010/04/25 10:48:00  Valentijn
Veranderingen gemaakt om spi deling met us1 te realiseren bijna af mist commentaar

Revision 1.3  2010/04/16 07:51:12  0782531
Basis header toegevoegd.
Defines gebruikt voor algemene benamingen van waardes.


*/

#include <mod/include/UART.h>

unsigned int UART0_Init(unsigned int baudrate){
   if(!(p_flag&US0_ID)){                                     //Check of module al aanstaat
      p_pPMC->PMC_PCER |= US0_ID;                            //Enable Peripheral clock for USART0
      p_flag |= US0_ID;                                      //Zet Flag aan
      p_pPIO->PIO_ASR = 0x00000060;                          //Zet de juiste toewijzingen naar de peripheral
      p_pPIO->PIO_PDR = 0x00000060;                          //Zet de pinnen naar peripheral stand
      p_pUS0->US_CR   = 0x000000AC;                          //Stel de juiste instellingen
      p_pUS0->US_MR   = 0x003808C0;                          //
      p_pUS0->US_BRGR = (SPEED_ARM/8)/baudrate;              //Stel de juiste baudrate in
      p_pUS0->US_CR   = 0x00000050;                          //Zet module aan
      return(1);                                             //geef terug dat module geinitialiseerd is
   }else{
      return(0);                                             //geef terug dat module al geintialiseerd is
   }
}

void UART0_Write(unsigned char ch){
    while (!(p_pUS0->US_CSR & AT91C_US_TXRDY));              //Wacht op lege Tx Buffer
    p_pUS0->US_THR = ch;                                     //Zet karakter in buffer om te verzenden
}

unsigned int UART0_Data_Ready(void){
   return (p_pUS0->US_CSR & 0x01);                           //Geef data terug
}

int UART0_Read(void){
   if(p_flag&US0_ID){                                        //Check of module geinitialiseerd is
      if(p_pUS0->US_CSR & 0x01){                             //Check of er data ontvangen is
         return(p_pUS0->US_RHR&0xFF);                        //Geef data terug
      }else{
         return(-1);                                         //Geef terug dat er geen data ontvangen is
      }
   }else{
      return(-2);                                            //Geef terug dat de module niet geinitialiseerd is
   }
}

void UART0_Stop(void){
   while (!(p_pUS0->US_CSR & AT91C_US_TXRDY));               //Wacht op lege Tx Buffer
   p_flag &= ~US0_ID;                                        //Zet flag uit
   p_pUS0->US_CR   = 0x000000AC;                             //Reset module
   p_pPIO->PIO_PER = 0x00000060;                             //Geef io terug
   p_pPMC->PMC_PCDR |= US0_ID;                              //Disable Peripheral clock voor USART0
}





unsigned int UART1_Init(unsigned int baudrate){
   if(!(p_flag&US1_ID)){
      if(!(p_flag&SPI_ID)){
         p_pPMC->PMC_PCER |= US1_ID;                         //Enable Peripheral clock for USART0
         p_flag |= US1_ID;                                   //Zet flag aan
         p_pPIO->PIO_ASR = 0x00600000;                       //Zet de juiste toewijzingen naar de peripheral
         p_pPIO->PIO_PDR = 0x00600000;                       //Zet de pinnen naar peripheral stand
         p_pUS1->US_CR   = 0x000000AC;                       //Stel de juiste instellingen in
         p_pUS1->US_MR   = 0x003808C0;                       //als je dit leest weet je het echt niet meer he, geeft niks ik ook niet maar denk is gewoon leuk om er achter te schrijven
         p_pUS1->US_BRGR = (SPEED_ARM/8)/baudrate;           //Stel juiste baudrate in
         p_pUS1->US_CR   = 0x00000050;                       //Start module
         return(1);                                          //Geef terug dat module gestart is
      }else{
         return(0);                                          //Geef terug dat SPI al gestart is
      }
  }else{
     return(2);                                              //Geef terug dat module al gestart is
  }
}

void UART1_Write(unsigned char ch){
   while (!(p_pUS1->US_CSR & AT91C_US_TXRDY));               //Wacht op lege Tx Buffer
   p_pUS1->US_THR = ch;                                      //Zend karakter
}

unsigned int UART1_Data_Ready(void){
   return (p_pUS1->US_CSR & 0x01);                           //Geef terug of er data ontvangen is
}

int UART1_Read(void){
   if(p_flag&US1_ID){                                        //Check of module aan staat
      if(p_pUS1->US_CSR & 0x01){                             //Check of er wat ontvangen is
         return(p_pUS1->US_RHR&0xFF);                        //Geef terug wat ontvangen is
      }else{
         return(-1);                                         //Geef terug dat er niks ontvangen is
      }
   }else{
      return(-2);                                            //Geef terug dat module niet aanstaat
   }
}

void UART1_Stop(void){
   while (!(p_pUS1->US_CSR & AT91C_US_TXRDY));               //Wacht op lege Tx Buffer
   p_flag &= ~US1_ID;                                        //Zet flag laag
   p_pUS1->US_CR   = 0x000000AC;                             //Reset module
   p_pPMC->PMC_PCDR |= US1_ID;                              //Disable Peripheral clock voor USART0
   p_pPIO->PIO_PER = 0x00600000;                             //Zet de pinnen naar IO stand
}
